﻿using System;
using System.Windows.Controls.Primitives;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Data;
using produccion.clases;
using System.ComponentModel;
using System.IO;
using System.Diagnostics;
using produccion.vistamodelo;
using produccion.reportes;

using System.Security.Principal;//FJRF - Agregada para comprobar la seguridad

namespace produccion.forms
{
    /// <summary>
    /// Lógica de interacción para FrmImpresionDeCodigosDeBarras.xaml
    /// </summary>
    public partial class FrmImpresionDeCodigosDeBarras : Window
    {
        MDOgeneral MdoGeneral = new MDOgeneral();//FJRF - Traemos toda la informacion y funciones de MdoGeneral
        
        DataTable DtConsulta;//FJRF - Usamos este DataTable para hacer consultas generales
        DataTable DtConsultaTemporal;//FJRF - Usamos este DataTable para hacer consultas generales temporales
        DataTable Dt;//FJRF - Para los datos originales de la orden
        String StrCodigoPrimerColorReferencia;//FJRF - Para el codigo de la referencia de la foto

        DataSet DsConsulta;//FJRF - Usamos este DataTable para hacer consultas generales
        String StrConsulta;//FJRF - Usamos este DataTable para hacer consultas generales

        string StrMensajeBox = "";//FJRF - Para los mensajes de las cajas de texto
        string StrCaptionBox = "";//FJRF - Para los mensajes de los caption de las cajas de texto

        String StrLineaAEjecutarEnCmd;//FJRF - Linea a ejecutar en el Cmd

        int IntCantidadDeTallas, IntCantidadEtiquetasAImprimir;//FJRf - Datos de la impresion

        public FrmImpresionDeCodigosDeBarras()
        {
            InitializeComponent();
        }
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            string strTituloVentana = "GENERAR TIQUETES" + " - Usuario:" + MDOgeneral.usuario + " - [FrmImpresionDeCodigosDeBarras]";
            Title = strTituloVentana;

            StrConsulta = "SELECT * FROM CONTROLP WHERE ID_CON = 'TIQ' ORDER BY NOM_CON";
            CargarCombo(CboFormato, StrConsulta, "COD_CON", "NOM_CON");

            MDOgeneral.DsConsultaImpresoras = new DataSet();
            if (MDOgeneral.DtImpresorasCodigoBarras.Rows.Count > 0)//FJRF - Si hay datos llenar el combo
            {
                MDOgeneral.DsConsultaImpresoras.Tables.Add(MDOgeneral.DtImpresorasCodigoBarras.Copy());//FJRF - Adicionameos el datatable al dataset
                CboImpresora.ItemsSource = MDOgeneral.DsConsultaImpresoras.Tables[0].DefaultView;//FJRF - Cargamos los datos encontrados
                CboImpresora.SelectedValuePath = "RUTAIMPRESORA";//FJRF - Cargamos la posicion
                CboImpresora.DisplayMemberPath = "IMPRESORA";//FJRF - Decimos cual dato se mostrara
            }
            CboFormato.SelectedIndex = 0;
            CboImpresora.SelectedIndex = 0;

            TxtOrden.Style = null;//FJRF - Le quitamos el stilo para poder controlar el foco

            TxtOrden.Focus();
        }
        private void btnSalir_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }
        //FJRF - Con esta funcion cargamos los combos (Cargar combos)
        private Boolean CargarCombo(ComboBox CboComboACargar, string strConsultaOracle, string strSelectedValuePath, string strDisplayMemberPath)
        {
            Boolean BooSiHayDatos = false;//FJRF - Variable para informar si hay datos o no
            CboComboACargar.ItemsSource = null;
            CboComboACargar.Items.Clear();//FJRF - Borramos los posibles datos que pueda tener el combo

            DtConsulta = new DataTable();//FJRF - Inicializamos la variable
            DsConsulta = new DataSet();//FJRF - Inicializamos la variable

            DtConsulta = MdoGeneral.consulta(strConsultaOracle);//FJRF - Realizamos la consulta y retornamos los datos

            if (DtConsulta.Rows.Count > 0)//FJRF - Si hay datos llenar el combo
            {
                BooSiHayDatos = true;//FJRF - Informamos que hay datos

                DsConsulta.Tables.Add(DtConsulta);//FJRF - Adicionameos el datatable al dataset
                CboComboACargar.ItemsSource = DsConsulta.Tables[0].DefaultView;//FJRF - Cargamos los datos encontrados
                CboComboACargar.SelectedValuePath = strSelectedValuePath;//FJRF - Cargamos la posicion
                CboComboACargar.DisplayMemberPath = strDisplayMemberPath;//FJRF - Decimos cual dato se mostrara

                CboComboACargar.Text = "";//FJRF - Ponemos el combo en la primera posicion
            }
            return BooSiHayDatos;//FJRF - Avisamos que si hay o no hay datos
        }
        private void DtgTallasSoloParaVerSinEditar_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
        {
            string strNombreColumna = "";//FJRF - Variable para saber el nombre de la columna
            strNombreColumna = e.Column.Header.ToString();//FJRF - Extraemos el nombre de la columna

            if (strNombreColumna == "TOTAL")
            {
                Style MyStyleTextAlignmentProperty = new Style(typeof(DataGridCell));//FJRF - Creamos un nuevo estilo para la celda
                MyStyleTextAlignmentProperty.Setters.Add(new Setter(TextBlock.TextAlignmentProperty, TextAlignment.Right));//FJRF - Alineamos los datos de la celda a la derecha

                (e.Column as DataGridTextColumn).Binding.StringFormat = "{0:##,#0.##}";//FJRF - Enviamos el formato a la celda
                (e.Column as DataGridTextColumn).CellStyle = MyStyleTextAlignmentProperty;//FJRF - Alineamos la celda a la derecha
            }
            e.Column.IsReadOnly = true;//FJRF - Inavilita las columnas para que no se pueda escribir sobre ella
        }
        private void DtgInformacion_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
        {
            string strNombreColumna = "";//FJRF - Variable para saber el nombre de la columna
            strNombreColumna = e.Column.Header.ToString();//FJRF - Extraemos el nombre de la columna

            if (strNombreColumna == "TOTAL")
            {
                Style MyStyleTextAlignmentProperty = new Style(typeof(DataGridCell));//FJRF - Creamos un nuevo estilo para la celda
                MyStyleTextAlignmentProperty.Setters.Add(new Setter(TextBlock.TextAlignmentProperty, TextAlignment.Right));//FJRF - Alineamos los datos de la celda a la derecha

                (e.Column as DataGridTextColumn).Binding.StringFormat = "{0:##,#0.##}";//FJRF - Enviamos el formato a la celda
                (e.Column as DataGridTextColumn).CellStyle = MyStyleTextAlignmentProperty;//FJRF - Alineamos la celda a la derecha

                e.Column.IsReadOnly = true;//FJRF - Inavilita las columnas para que no se pueda escribir sobre ella
            }
            if (strNombreColumna == "CODREF" || strNombreColumna == "MATERIAL" || strNombreColumna == "CODCOL" || strNombreColumna == "COLOR")
            {
                e.Column.IsReadOnly = true;//FJRF - Inavilita las columnas para que no se pueda escribir sobre ella
            }
        }
        #region ParaAlinearALaDerecha
        public static Style newCellStyleAlinearDerecha()
        {
            System.Windows.Style style = new Style(typeof(DataGridCell));
            style.Setters.Add(new System.Windows.Setter
            {
                Property = Control.HorizontalAlignmentProperty,
                Value = HorizontalAlignment.Right
            });
            return style;
        }
        #endregion
        private void DtgDatosAProcesar_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
        {
            string strNombreColumna = "";//FJRF - Variable para saber el nombre de la columna
            strNombreColumna = e.Column.Header.ToString();//FJRF - Extraemos el nombre de la columna

            if (strNombreColumna == "CANTIDAD")
            {
                (e.Column as DataGridTextColumn).Binding.StringFormat = "{0:##,#0.##}";//FJRF - Enviamos el formato a la celda
                (e.Column as DataGridTextColumn).CellStyle = newCellStyleAlinearDerecha();//FJRF - Alineamos la celda a la derecha
            }
            e.Column.IsReadOnly = true;//FJRF - Inavilita las columnas para que no se pueda escribir sobre ella
        }
        private void TxtOrden_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)
            {
                PttV_BuscarOrden();
            }
        }
        private void PttV_BuscarOrden()
        {
            #region FJRF - VARIABLES
            String StrConsulta;//FJRF - Variable para generar el sql a consultar
            String StrDato, StrReferencia, StrTalla, StrCantidad;

            DataTable DtBuscarTallas = new DataTable();

            Boolean BooHayDatos = false;//FJRF - variable que maneja la informacion si hay datos o no en la consulta
            #endregion

            #region Jovanny
            string query = "select a.codref_eop, c.nomref_ref, a.codcol_eop, d.nomcol_col, a.codcli_eop, b.nomcli_cli, a.nroped_eop from encordp a inner join maeclip b on a.codcli_eop=b.codcli_cli inner join maeref c on a.codref_eop=c.codref_ref inner join maecol d on a.codcol_eop=d.codcol_col where nroord_eop='" + TxtOrden.Text.Trim() + "'";
            DataTable dtOrden = MdoGeneral.consulta(query);

            if (dtOrden.Rows.Count > 0)
            {
                txtPedido.Text = dtOrden.Rows[0]["NROPED_EOP"].ToString();
                txtCodigoCliente.Text = dtOrden.Rows[0]["CODCLI_EOP"].ToString();
                txtNombreCliente.Text = dtOrden.Rows[0]["NOMCLI_CLI"].ToString();
                txtCodigoReferencia.Text = dtOrden.Rows[0]["CODREF_EOP"].ToString();
                txtNombreReferencia.Text = dtOrden.Rows[0]["NOMREF_REF"].ToString();
                txtCodigoColor.Text = dtOrden.Rows[0]["CODCOL_EOP"].ToString();
                txtNombreColor.Text = dtOrden.Rows[0]["NOMCOL_COL"].ToString();
            }
            
            #endregion

            #region FJRF - CREAMOS EL ENCABEZADO DE LAS TALLAS
            //StrConsulta = "SELECT codref_dop AS Cod/Ref, MATERIAL_REF As Referencia, codcol_dop As Cod/Col, NOMCOL_COL As Color FROM VIS_BAR_ORDIMP WHERE nroord_dop = '" + TxtOrden.Text.Trim() + "' GROUP BY Cod/Ref, Referencia, Cod/Col, Color";//FJRF - Buscamos el dato consultado por el usuario pero solo la informacion de las tallas
            StrConsulta = "SELECT codref_dop as CodRef, MATERIAL_REF as Material, codcol_dop as CodCol, NOMCOL_COL As Color FROM VIS_BAR_ORDIMP WHERE nroord_dop = '" + TxtOrden.Text.Trim() + "' GROUP BY codref_dop, MATERIAL_REF, codcol_dop, NOMCOL_COL";//FJRF - Buscamos el dato consultado por el usuario pero solo la informacion de las tallas

            DtConsulta = new DataTable();//FJRF - Limpiamos la tabla por si tiene datos ya que esta se usa para otros procesos

            DtConsulta = MdoGeneral.consulta(StrConsulta);//FJRF - Cargamos la consulta con los datos encontrados
            StrConsulta = "SELECT codtal_dop FROM VIS_BAR_ORDIMP WHERE nroord_dop = '" + TxtOrden.Text.Trim() + "' GROUP BY codtal_dop ORDER BY codtal_dop";//FJRF - Buscamos el dato consultado por el usuario pero solo la informacion de las tallas

            DtConsultaTemporal = MdoGeneral.consulta(StrConsulta);//FJRF - Cargamos la consulta con los datos encontrados

            IntCantidadDeTallas = 0;//FJRF - Limpiamos la variable para iniciar proceso

            for (int j = 0; j < DtConsultaTemporal.Rows.Count; j++)//FJRF - Recorremos la informacion encontrada
            {
                IntCantidadDeTallas++;//FJRF - Vamos contando las cantidades de las tallas
                DtConsulta.Columns.Add(new DataColumn(DtConsultaTemporal.Rows[j][0].ToString(), System.Type.GetType("System.Double")));//FJRF - Creamos las columnas pero notece que se empieza en la posicion cero (0)

                BooHayDatos = true;//FJRF - Informamos que si hay datos encontrados de la orden que se busco
            }
            DtConsulta.Columns.Add("TOTAL");

            if (BooHayDatos == true)//FJRF - Si hay datos hacemos lo siguiente
            {
                PonerImagen(DtConsulta.Rows[0][0].ToString(), DtConsulta.Rows[0][2].ToString(), DtConsulta.Rows[0][1].ToString());//FJRF - Ponomos la imagen que este en la primera posicion
                txtCodigoReferencia.Text = DtConsulta.Rows[0][0].ToString();
            }

            LblCantidadDeTallas.Content = IntCantidadDeTallas.ToString();//FJRF - Enviamos las cantidades encontradas de las tallas
            #endregion

            #region FJRF - LLENAMOS LAS TALLAS CON LAS CANTIDADES

            DtBuscarTallas = DtConsulta;//FJRF - Igualamos el Dt principal para recorrerlo buscando las tallas

            IntCantidadEtiquetasAImprimir = 0;//FJRF - Limpiamos la variable para iniciar proceso
            IntCantidadDeTallas = 0;//FJRF - Limpiamos la variable para iniciar proceso

            //FJRF - RECORREMOS LA CANTIDAD DE REFERENCIAS QUE TENGA LA ORDEN
            for (int IntRegistroActual = 0; IntRegistroActual < DtConsulta.Rows.Count; IntRegistroActual++)//FJRF - Recorremos la informacion encontrada
            {
                StrReferencia = DtConsulta.Rows[IntRegistroActual][0].ToString();//FJRF - Traemos el numero de la referencia a la cual vamos a llenar los datos

                StrConsulta = "SELECT codtal_dop, canord_dop FROM VIS_BAR_ORDIMP WHERE nroord_dop = '" + TxtOrden.Text.Trim() + "' AND codref_dop ='" + StrReferencia.Trim() + "' ORDER BY codtal_dop";//FJRF - Buscamos el dato consultado por el usuario pero solo las cantidades de las tallas
                DtConsultaTemporal = MdoGeneral.consulta(StrConsulta);//FJRF - Cargamos la consulta con los datos encontrados

                //FJRF - RECORREMOS REFERENCIA POR REFERENCIA PARA MIRAR LAS CANTIDADES A IMPRIMIR
                for (int IntFilaActual = 0; IntFilaActual < DtConsultaTemporal.Rows.Count; IntFilaActual++)//FJRF - Recorremos la informacion encontrada
                {
                    StrTalla = DtConsultaTemporal.Rows[IntFilaActual][0].ToString();//FJRF - Tramos la talla
                    StrCantidad = DtConsultaTemporal.Rows[IntFilaActual][1].ToString();//FJRF - Traemos la cantidad

                    IntCantidadEtiquetasAImprimir = IntCantidadEtiquetasAImprimir + int.Parse(StrCantidad.Trim());//FJRF - Vamos sumando las tallas

                    //FJRF - RECORREMOS LAS TALLAS PARA METER LA CANTIDAD EN LA TALLA CORRECTA
                    for (int IntPosicionActual = 0; IntPosicionActual < DtBuscarTallas.Columns.Count; IntPosicionActual++)//FJRF - Recorremos la informacion encontrada
                    {
                        StrDato = DtConsulta.Columns[IntPosicionActual].ToString();//FJRF - Buscamos la talla
                        if (StrTalla == StrDato)//FJRF - Si la talla es igual a la talla en el Dt hacemos lo siguiente
                        {
                            DtConsulta.Rows[IntRegistroActual][IntPosicionActual] = StrCantidad;//FJRF - Asignamos la talla en la posicion del Dt correcta
                        }
                    }
                }
                DtConsulta.Rows[IntRegistroActual][DtBuscarTallas.Columns.Count - 1] = IntCantidadEtiquetasAImprimir.ToString();//FJRF - Se pone la cantidad a imprimir por referencia
                IntCantidadDeTallas = IntCantidadDeTallas + IntCantidadEtiquetasAImprimir;//FJRF - Se lleva el acumulado total 

                IntCantidadEtiquetasAImprimir = 0;//FJRF - Limpiamos la variable para iniciar proceso
            }

            LblCantidadEtiquetasAImprimir.Content = IntCantidadDeTallas.ToString();//FJRF - Enviamos las cantidades encontradas de la suma de las tallas
            #endregion

            #region FJRF - CARGAMOS LA INFORMACION EN PANTALLA DEL GRID

            if (BooHayDatos == true)//FJRF - Si hay datos hacemos lo siguiente
            {
                BtnProcesar.IsEnabled = true;//FJRF - Permitimos procesar los datos
            }
            else//FJRF - Si no hay dato hacemos lo siguiente
            {
                BtnProcesar.IsEnabled = false;//FJRF - No permitimos procesar los datos
            }
            //FJRF -TALLAS MANIPULABLE
            DtgInformacion.ItemsSource = DtConsulta.DefaultView;//FJRF - Existan o no datos cargamos la informacion en el grid para que actualice los datos
            //FJRF -TALLAS SOLO LECTURA
            Dt = new DataTable("SoloLectura");//FJRF - Creamos un nuevo Dt de solo lectura para tener la informacion real de la orden
            Dt = DtConsulta.Copy();//FJRF - Copiamos la estructura de Dt y no lo igualamos para q no queden conectados de modo sincronizado
            DtgTallasSoloParaVerSinEditar.ItemsSource = Dt.DefaultView;//FJRF - Existan o no datos cargamos la informacion en el grid para que actualice los datos
            #endregion

            PttV_Procesar(false);//FJRF - Limpiamos el procesar
        }
        private void BtnProcesar_Click(object sender, RoutedEventArgs e)
        {
            PttV_Procesar(true);//FJRF - Procesamos los datos
        }
        protected void PttV_Procesar(Boolean BooProcesar)
        {
            String StrDatoExtraido = "";//FJRF - Para extraer el dato tal como viene

            if (BooProcesar == true)
            {
                #region CREAMOS LAS VARIABLES
                int IntCantidadDeTallasAImprimir;//FJRF - Variable que maneja la cantidad de tallas a imprimir

                DataTable DtDatosAProcesar = new DataTable("DtDatosAProcesar");//FJRF - Creamos el Dt de procesar datos
                DataRow DrNuevaFilaDatosAProcesar;//FJRF - Creamos el manejador de filas del Dt procesar datos

                DataTable DtRecorrerColumnas = new DataTable();//FJRF - Creamos un Dt para leer las columnas
                DataTable DtRecorrerFilas = new DataTable();//FJRF - Creamos un Dt para leer las filas

                int IntTallasAImprimir;//FJRF - Variable que se usara para sumar las tallas que realmente se imprimiran
                int IntNumeroDeTallasAImprimir;//FJRF - Variable que se usara para determinar la real cantidad de tallas a imprimir por referencia

                #endregion

                #region INICIALIZAMOS VARIABLES
                DtRecorrerColumnas = DtConsulta;//FJRF - Cargamos el grid de consultas donde estan los datos de la busqueda principal
                DtRecorrerFilas = DtConsulta;//FJRF - Cargamos el grid de consultas donde estan los datos de la busqueda principal

                IntCantidadDeTallasAImprimir = 0;//FJRF - Inicializamos el contador de tallas a imprimir

                IntTallasAImprimir = 0;//FJRF - Iniciamos la variable para la suma
                IntNumeroDeTallasAImprimir = 0;//FJRF - Iniciamos la variable para la suma
                #endregion

                #region CREAMOS LAS COLUMNAS DEL GRID DE PROCESOS
                DtDatosAProcesar.Columns.Add("CODREF");//FJRF - CREAMOS LA COLUMNA
                DtDatosAProcesar.Columns.Add("MATERIAL");//FJRF - CREAMOS LA COLUMNA
                DtDatosAProcesar.Columns.Add("CODCOL");//FJRF - CREAMOS LA COLUMNA
                DtDatosAProcesar.Columns.Add("COLOR");//FJRF - CREAMOS LA COLUMNA
                DtDatosAProcesar.Columns.Add("TALLA");//FJRF - CREAMOS LA COLUMNA
                DtDatosAProcesar.Columns.Add("CANTIDAD");//FJRF - CREAMOS LA COLUMNA
                #endregion

                #region LLENAMOS LA INFORMACION DEL GRID DE PROCESOS
                for (int IntFilaActual = 0; IntFilaActual < DtRecorrerFilas.Rows.Count; IntFilaActual++)//FJRF - Recorremos la informacion encontrada
                {
                    for (int IntColumnaActual = 4; IntColumnaActual < DtRecorrerColumnas.Columns.Count - 1; IntColumnaActual++)//FJRF - Recorremos la informacion encontrada
                    {
                        StrDatoExtraido = DtRecorrerColumnas.Rows[IntFilaActual][IntColumnaActual].ToString();//FJRF - Extraemos el dato como viene
                        if (String.IsNullOrEmpty(StrDatoExtraido) == true) { StrDatoExtraido = "0"; }//FJRF - Si viene vacio le enviamos un cero por defecto
                        IntCantidadDeTallasAImprimir = int.Parse(StrDatoExtraido);//FJRF - Extraemos el valor de cantidad en una variable q se pueda manipular mas facil

                        if (IntCantidadDeTallasAImprimir > 0)//FJRF - Si la cantidad a imprimir es mayor a cero entonces hacer lo siguiente
                        {
                            IntTallasAImprimir++;//FJRF - Contamos las tallas
                            IntNumeroDeTallasAImprimir = IntNumeroDeTallasAImprimir + IntCantidadDeTallasAImprimir;//FJRF - Sumamos la cantidad de tallas

                            DrNuevaFilaDatosAProcesar = DtDatosAProcesar.NewRow();//FJRF - Creamos una fila nueva para ingresar los datos

                            DrNuevaFilaDatosAProcesar["CODREF"] = DtRecorrerFilas.Rows[IntFilaActual][0].ToString();//FJRF - Enviamos los datos encontrados
                            DrNuevaFilaDatosAProcesar["MATERIAL"] = DtRecorrerFilas.Rows[IntFilaActual][1].ToString();//FJRF - Enviamos los datos encontrados
                            DrNuevaFilaDatosAProcesar["CODCOL"] = DtRecorrerFilas.Rows[IntFilaActual][2].ToString();//FJRF - Enviamos los datos encontrados
                            DrNuevaFilaDatosAProcesar["COLOR"] = DtRecorrerFilas.Rows[IntFilaActual][3].ToString();//FJRF - Enviamos los datos encontrados

                            DrNuevaFilaDatosAProcesar["TALLA"] = DtRecorrerColumnas.Columns[IntColumnaActual];//FJRF - Enviamos los datos encontrados
                            DrNuevaFilaDatosAProcesar["CANTIDAD"] = DtRecorrerColumnas.Rows[IntFilaActual][IntColumnaActual];//FJRF - Enviamos los datos encontrados

                            DtDatosAProcesar.Rows.Add(DrNuevaFilaDatosAProcesar);//FJRF - Adicionamos los datos creados a la tabla

                            IntCantidadDeTallasAImprimir = 0;//FJRF - Limpiamos la cantidad de tallas a imprimir
                        }
                    }
                }
                LblTallasAImprimir.Content = IntTallasAImprimir;
                LblNumeroDeTallasAImprimir.Content = IntNumeroDeTallasAImprimir;

                DtgDatosAProcesar.ItemsSource = DtDatosAProcesar.DefaultView;//FJRF - Existan o no datos cargamos la informacion en el grid para que actualice los datos
                #endregion

                #region VALIDAR SI LOS DATOS SON CORRECTOS PARA HABILITAR EL BOTON IMPRIMIR
                if (int.Parse(LblNumeroDeTallasAImprimir.Content.ToString()) > int.Parse(LblCantidadEtiquetasAImprimir.Content.ToString()))
                {
                    StrCaptionBox = "PROCESO CANCELADO";
                    StrMensajeBox = "Datos incorrectos: El número total de tallas a imprimir (" + LblNumeroDeTallasAImprimir.Content + ") no puede ser superior al número total autorizado (" + LblCantidadEtiquetasAImprimir.Content + ") en la orden ("+ TxtOrden.Text.Trim() +")... ";
                    StrMensajeBox = StrMensajeBox + "Favor corrija los datos he intentelo nuevamente";
                    Msgbox(StrCaptionBox, StrMensajeBox, MessageBoxButton.OK, MessageBoxImage.Error);

                    PttV_Procesar(false);
                    BtnImprimirEtiquetas.IsEnabled = false;
                }
                else
                {
                    #region VALIDAMOS LOS DATOS DE LAS CANTIDADES DE LAS TALLAS PARA QUE SEAN MENOR O IGUAL AL VALOR DE LA ORDEN
                    int IntValorRealOrden = 0;//FJRF - Para capturar el valor de la orden
                    int IntNuevoValorOrden = 0;//FJRF - Para el nuevo valor de la orden a imprimir
                    String StrTallaConError = "";//FJRF - Para tener el valor de la talla con error
                    String StrCodigoDeLaReferenciaConError = "";//FJRF - para capturar la referecia con error

                    Boolean BooValorErroneoArreglado = false;//FJRF - Variable para informar si se ha arreglado algun dato malo

                    for (int IntFilaActual = 0; IntFilaActual < DtRecorrerFilas.Rows.Count; IntFilaActual++)//FJRF - Recorremos la informacion encontrada
                    {
                        for (int IntColumnaActual = 4; IntColumnaActual < DtRecorrerColumnas.Columns.Count - 1; IntColumnaActual++)//FJRF - Recorremos la informacion encontrada
                        {
                            StrDatoExtraido = Dt.Rows[IntFilaActual][IntColumnaActual].ToString();//FJRF - Extraemos el dato como viene
                            if (String.IsNullOrEmpty(StrDatoExtraido) == true) { StrDatoExtraido = "0"; }//FJRF - Si viene vacio le enviamos un cero por defecto
                            IntValorRealOrden = int.Parse(StrDatoExtraido);//FJRF - Extraemos el valor de cantidad en una variable q se pueda manipular mas facil

                            StrDatoExtraido = DtRecorrerColumnas.Rows[IntFilaActual][IntColumnaActual].ToString();//FJRF - Extraemos el dato como viene
                            if (String.IsNullOrEmpty(StrDatoExtraido) == true) { StrDatoExtraido = "0"; }//FJRF - Si viene vacio le enviamos un cero por defecto
                            IntNuevoValorOrden = int.Parse(StrDatoExtraido);//FJRF - Extraemos el valor de cantidad en una variable q se pueda manipular mas facil

                            if (IntNuevoValorOrden > IntValorRealOrden)//FJRF - Si la cantidad a imprimir es mayor a la cantidad de la orden
                            {
                                StrTallaConError = DtRecorrerColumnas.Columns[IntColumnaActual].ToString();
                                StrCodigoDeLaReferenciaConError = DtRecorrerColumnas.Rows[IntFilaActual][0].ToString();

                                BooValorErroneoArreglado = true;
                                break;
                            }
                        }
                        if (BooValorErroneoArreglado == true)
                        {
                            break;
                        }
                    }
                    if (BooValorErroneoArreglado == true)
                    {
                        StrCaptionBox = "PROCESO CANCELADO";
                        StrMensajeBox = "Datos incorrectos: El número asignado en la talla (" + StrTallaConError + ") con el valor (" + IntNuevoValorOrden + ") no puede ser superior al número total autorizado que es (" + IntValorRealOrden + ") en la orden (" + TxtOrden.Text.Trim() + ") de la referencia (" + StrCodigoDeLaReferenciaConError + ")... ";
                        StrMensajeBox = StrMensajeBox + "Favor corrija los datos he intentelo nuevamente";
                        Msgbox(StrCaptionBox, StrMensajeBox, MessageBoxButton.OK, MessageBoxImage.Error);

                        PttV_Procesar(false);
                        BtnImprimirEtiquetas.IsEnabled = false;
                    }
                    else
                    {
                        BtnImprimirEtiquetas.IsEnabled = true;
                    }
                    #endregion
                }
                #endregion
            }
            else//FJRF - Si variable igual a false limpiamos los datos
            {
                DtgDatosAProcesar.ItemsSource = null;//FJRF - Limpiamos grid

                LblTallasAImprimir.Content = "0";//FJRF - Variable
                LblNumeroDeTallasAImprimir.Content = "0";//FJRF - Variable
            }
        }
        protected void Msgbox(String StrCaption, String StrMensaje, MessageBoxButton MsbTipoBoton, MessageBoxImage MsbTipoImagenIcono)
        {
            MessageBoxButton buttons;
            buttons = MsbTipoBoton;

            MessageBoxImage icon = MsbTipoImagenIcono;
            MessageBox.Show(StrMensaje, StrCaption, buttons, icon);
        }
        //FJRF - PROCEDIMIENTO PARA DEVOLVER LA CELDA DE UN GRID (SE RECIBE EL GRID LA FILA Y LA COLUMNA A CONSULTAR)
        private string ReturnDataGridCellText(DataGrid Dtg, object ObjItemFila, int IntColumna)
        {
            string strValorRetornado = "";//FJRF - Limpiamos el valor a retornar

            DataGridRow row = (DataGridRow)Dtg.ItemContainerGenerator.ContainerFromItem(ObjItemFila);//FJRF - Miramos cual es la fila a consultar
            TextBlock cellContent = Dtg.Columns[IntColumna].GetCellContent(row) as TextBlock;//FJRF - Enviamos el dato de la fila y la columna para tener el dato de la celda

            strValorRetornado = cellContent.Text;//FJRF - Retornamos el valor de la celda solo el texto

            return strValorRetornado.Trim();//FJRF - Retornamos el valor sin espacion
        }
        private void BtnBuscarOrden_Click(object sender, RoutedEventArgs e)
        {
            PttV_BuscarOrden();
        }
        private void EjecutarSp_ImpBarras(string strFormato, string strUsuario, string strOrden)//FJRF - Este procedimiento ejecuta un sp
        {
            try
            {
                MDOgeneral.spComando.CommandText = "SP_IMPBARRASP";
                MDOgeneral.spComando.Connection = MDOgeneral.conexion;
                MDOgeneral.spComando.CommandType = CommandType.StoredProcedure;
                MDOgeneral.spComando.Parameters.Clear();

                //Input
                MDOgeneral.spComando.Parameters.Add("pva_codfor", Oracle.DataAccess.Client.OracleDbType.Varchar2, 40).Value = String.IsNullOrEmpty(strFormato) ? "   " : strFormato;
                MDOgeneral.spComando.Parameters.Add("pva_codusu", Oracle.DataAccess.Client.OracleDbType.Varchar2, 40).Value = String.IsNullOrEmpty(strUsuario) ? "   " : strUsuario;
                MDOgeneral.spComando.Parameters.Add("pva_nroord", Oracle.DataAccess.Client.OracleDbType.Varchar2, 40).Value = String.IsNullOrEmpty(strOrden) ? "   " : strOrden;

                //Output salidas
                MDOgeneral.spComando.Parameters.Add("pva_result", Oracle.DataAccess.Client.OracleDbType.Varchar2, 2000).Direction = ParameterDirection.Output;
                MDOgeneral.spComando.Parameters.Add("pva_errusu", Oracle.DataAccess.Client.OracleDbType.Varchar2, 2000).Direction = ParameterDirection.Output;
                MDOgeneral.spComando.ExecuteNonQuery();
            }
            catch (Exception ex) { throw ex; }
        }
        private static bool IsAdministrator()
        {
            WindowsIdentity identity = WindowsIdentity.GetCurrent();
            WindowsPrincipal principal = new WindowsPrincipal(identity);
            return principal.IsInRole(WindowsBuiltInRole.Administrator);
        }
        private void EjecutarComando(string StrComando)//FJRF - Este procedimiento ejecuta un comando en dos (CMD)
        {
            System.Diagnostics.Process proc = new System.Diagnostics.Process();
            proc.EnableRaisingEvents = false;
            proc.StartInfo.FileName = "cmd";
            proc.StartInfo.RedirectStandardInput = true;
            proc.StartInfo.RedirectStandardOutput = true;
            proc.StartInfo.CreateNoWindow = true;
            proc.StartInfo.UseShellExecute = false;
            
            proc.StartInfo.Verb = "runas";

            try
            {
                proc.Start();
                proc.StandardInput.WriteLine(StrComando);

                proc.StandardInput.Flush();
                proc.StandardInput.Close();
                proc.Close();
            }
            catch (Exception)
            {
                Console.WriteLine("Error");
            }
        }

        #region FJRF - PonerFoto

        private void PonerImagen(string strCodigoReferencia, string strCodigoColor, string strNombreReferencia)
        {
            if (String.IsNullOrEmpty(strCodigoColor))
            {
                BitmapImage b = new BitmapImage();
                if (File.Exists(MDOgeneral.Fotos_BOSI + strCodigoReferencia + ".jpg"))
                {
                    b.BeginInit();
                    b.UriSource = new Uri(MDOgeneral.Fotos_BOSI + strCodigoReferencia + ".jpg");
                    b.EndInit();
                    imgFoto.Stretch = Stretch.Fill;
                    imgFoto.Source = b;
                    ImagenTooltip.Source = b;
                    txbNombreImagen.Text = strNombreReferencia;
                }
                else
                {
                    imgFoto.Source = null;
                }
            }
            else
            {
                BitmapImage b = new BitmapImage();
                if (File.Exists(MDOgeneral.Fotos_BOSI + strCodigoReferencia + strCodigoColor + ".jpg"))
                {
                    b.BeginInit();
                    b.UriSource = new Uri(MDOgeneral.Fotos_BOSI + strCodigoReferencia + strCodigoColor + ".jpg");
                    b.EndInit();
                    imgFoto.Stretch = Stretch.Fill;
                    imgFoto.Source = b;
                    ImagenTooltip.Source = b;
                    txbNombreImagen.Text = strNombreReferencia;
                }
                else
                {
                    if (File.Exists(MDOgeneral.Fotos_BOSI + strCodigoReferencia + StrCodigoPrimerColorReferencia + ".jpg"))
                    {
                        b.BeginInit();
                        b.UriSource = new Uri(MDOgeneral.Fotos_BOSI + strCodigoReferencia + StrCodigoPrimerColorReferencia + ".jpg");
                        b.EndInit();
                        imgFoto.Stretch = Stretch.Fill;
                        imgFoto.Source = b;
                        ImagenTooltip.Source = b;
                        txbNombreImagen.Text = strNombreReferencia;
                    }
                    else
                    {
                        Boolean BooExiste = false;
                        //Foto para cualquier color-Consultar colores para referencia
                        clases.CLSMAEPRO mae = new clases.CLSMAEPRO { CODREF_PRO = strCodigoReferencia };
                        DataTable val = mae.BuscarColor();

                        foreach (DataRow r in val.Rows)
                        {
                            if (!String.IsNullOrEmpty(r["Codigo"].ToString()))
                            {
                                string StrRuta = MDOgeneral.Fotos_BOSI + strCodigoReferencia + r["Codigo"].ToString() + ".jpg";
                                if (File.Exists(StrRuta))
                                {

                                    BitmapImage BitFoto = new BitmapImage();
                                    BitFoto.BeginInit();
                                    BitFoto.UriSource = new Uri(StrRuta);
                                    BitFoto.EndInit();
                                    imgFoto.Source = BitFoto;
                                    ImagenTooltip.Source = BitFoto;
                                    txbNombreImagen.Text = strNombreReferencia;

                                    BooExiste = true;

                                    break;//FJRF - Si la encontro nos salimos
                                }
                            }
                        }

                        if (BooExiste == false)
                        {
                            imgFoto.Source = null;
                        }
                    }
                }
            }
        }

        #endregion

        #region ParaObtenerLasPropiedadesDeLaCeldaDelGrid
        static class DataGridHelper
        {
            static public DataGridCell GetCell(DataGrid dg, int row, int column)
            {
                DataGridRow rowContainer = GetRow(dg, row);

                if (rowContainer != null)
                {
                    DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(rowContainer);

                    // try to get the cell but it may possibly be virtualized
                    DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);
                    if (cell == null)
                    {
                        // now try to bring into view and retreive the cell
                        dg.ScrollIntoView(rowContainer, dg.Columns[column]);
                        cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);
                    }
                    return cell;
                }
                return null;
            }

            static public DataGridRow GetRow(DataGrid dg, int index)
            {
                if (index != -1)
                {
                    DataGridRow row = (DataGridRow)dg.ItemContainerGenerator.ContainerFromIndex(index);
                    if (row == null)
                    {
                        // may be virtualized, bring into view and try again
                        dg.ScrollIntoView(dg.Items[index]);
                        row = (DataGridRow)dg.ItemContainerGenerator.ContainerFromIndex(index);
                    }
                    return row;
                }
                else
                {
                    return null;
                }
            }

            static T GetVisualChild<T>(Visual parent) where T : Visual
            {
                T child = default(T);
                int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
                for (int i = 0; i < numVisuals; i++)
                {
                    Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
                    child = v as T;
                    if (child == null)
                    {
                        child = GetVisualChild<T>(v);
                    }
                    if (child != null)
                    {
                        break;
                    }
                }
                return child;
            }
        }
        #endregion
        private void DtgInformacion_KeyUp(object sender, KeyEventArgs e)
        {
            PonerFotoAlDelGridEnFilaSeleccionada(DtgInformacion);

            String StrDatoExtraido = "";//FJRF - Para extraer un valor y poder manipular su resultado

            int IntTallasAImprimir = 0;//FJRF - Limpiamos la cantidad de tallas a imprimir
            int IntNumeroDeTallasAImprimir = 0;//FJRF - Limpiamos la cantidad de tallas a imprimir
            int IntNumeroDeTallasAImprimirPorFila = 0;//FJRF - Limpiamos la cantidad de tallas a imprimir por fila
            int IntCantidadDeTallasAImprimir = 0;//FJRF - Limpiamos la cantidad de tallas a imprimir

            int IntValorRealOrden = 0;//FJRF - Para capturar el valor de la orden
            int IntNuevoValorOrden = 0;//FJRF - Para el nuevo valor de la orden a imprimir
            
            Boolean BooValorErroneoArreglado = false;//FJRF - Variable para informar si se ha arreglado algun dato malo
            
            DataTable DtRecorrerFilas = new DataTable("RecorrerFilas");//FJRF - Creamos el nuevo Dt para recorrer las filas
            DataTable DtRecorrerColumnas = new DataTable("RecorrerColumnas");//FJRF - Creamos el nuevo Dt para recorrer las columnas

            DtRecorrerFilas = DtConsulta;
            DtRecorrerColumnas = DtConsulta;

            #region VALIDAMOS LOS DATOS DE LAS CANTIDADES DE LAS TALLAS PARA QUE SEAN MENOR O IGUAL AL VALOR DE LA ORDEN
            for (int IntFilaActual = 0; IntFilaActual < DtRecorrerFilas.Rows.Count; IntFilaActual++)//FJRF - Recorremos la informacion encontrada
            {
                for (int IntColumnaActual = 4; IntColumnaActual < DtRecorrerColumnas.Columns.Count - 1; IntColumnaActual++)//FJRF - Recorremos la informacion encontrada
                {
                    StrDatoExtraido = Dt.Rows[IntFilaActual][IntColumnaActual].ToString();//FJRF - Extraemos el dato como viene
                    if (String.IsNullOrEmpty(StrDatoExtraido) == true){StrDatoExtraido = "0";}//FJRF - Si no tiene datos le enviamos un cero
                    IntValorRealOrden = int.Parse(StrDatoExtraido);//FJRF - Extraemos el valor de cantidad en una variable q se pueda manipular mas facil

                    StrDatoExtraido = DtRecorrerColumnas.Rows[IntFilaActual][IntColumnaActual].ToString();//FJRF - Extraemos el dato como viene
                    if (String.IsNullOrEmpty(StrDatoExtraido) == true) { StrDatoExtraido = "0"; }//FJRF - Si no tiene datos le enviamos un cero
                    IntNuevoValorOrden = int.Parse(StrDatoExtraido);//FJRF - Extraemos el valor de cantidad en una variable q se pueda manipular mas facil

                    if (IntNuevoValorOrden > IntValorRealOrden)//FJRF - Si la cantidad a imprimir es mayor a la cantidad de la orden
                    {
                        DtConsulta.Rows[IntFilaActual][IntColumnaActual] = IntValorRealOrden;
                        BooValorErroneoArreglado = true;
                        break;
                    }
                }
                if (BooValorErroneoArreglado == true)
                {
                    break;
                }
            }
            #endregion

            //FJRF - SUMAMOS LAS FILAS PARA VER LAS CANTIDADES DE TALLAS
            for (int IntFilaActual = 0; IntFilaActual < DtRecorrerFilas.Rows.Count; IntFilaActual++)//FJRF - Recorremos la informacion encontrada
            {
                for (int IntColumnaActual = 4; IntColumnaActual < DtRecorrerColumnas.Columns.Count - 1; IntColumnaActual++)//FJRF - Recorremos la informacion encontrada
                {
                    StrDatoExtraido = DtRecorrerColumnas.Rows[IntFilaActual][IntColumnaActual].ToString();//FJRF - Extraemos el dato como viene
                    if (String.IsNullOrEmpty(StrDatoExtraido) == true) { StrDatoExtraido = "0"; }//FJRF - Si no tiene datos le enviamos un cero
                    IntCantidadDeTallasAImprimir = int.Parse(StrDatoExtraido);//FJRF - Extraemos el valor de cantidad en una variable q se pueda manipular mas facil

                    if (IntCantidadDeTallasAImprimir > 0)//FJRF - Si la cantidad a imprimir es mayor a cero entonces hacer lo siguiente
                    {
                        IntTallasAImprimir++;//FJRF - Contamos las tallas
                        IntNumeroDeTallasAImprimir = IntNumeroDeTallasAImprimir + IntCantidadDeTallasAImprimir;//FJRF - Sumamos la cantidad de tallas
                        IntNumeroDeTallasAImprimirPorFila = IntNumeroDeTallasAImprimirPorFila + IntCantidadDeTallasAImprimir;//FJRF - Sumamos la cantidad de tallas

                        IntCantidadDeTallasAImprimir = 0;//FJRF - Limpiamos la cantidad de tallas a imprimir
                    }
                }
                DtConsulta.Rows[IntFilaActual][DtRecorrerColumnas.Columns.Count - 1] = IntNumeroDeTallasAImprimirPorFila;
                IntNumeroDeTallasAImprimirPorFila = 0;
            }
            LblTallasAImprimir.Content = IntTallasAImprimir;
            LblNumeroDeTallasAImprimir.Content = IntNumeroDeTallasAImprimir;

            #region VALIDAR SI LOS DATOS SON CORRECTOS PARA HABILITAR EL BOTON IMPRIMIR
            if (int.Parse(LblNumeroDeTallasAImprimir.Content.ToString()) > int.Parse(LblCantidadEtiquetasAImprimir.Content.ToString()))
            {
                PttV_Procesar(false);
                BtnImprimirEtiquetas.IsEnabled = false;
            }
            #endregion
        }
        private void PonerFotoAlDelGridEnFilaSeleccionada(DataGrid Dtg)
        {
            DataGridCell cell;
            string strCodigoReferencia, strNombreReferencia, strCodigoColor;

            cell = DataGridHelper.GetCell(Dtg, Dtg.SelectedIndex, 0);
            strCodigoReferencia = cell.ToString().Replace("System.Windows.Controls.DataGridCell:", "").Trim();

            cell = DataGridHelper.GetCell(Dtg, Dtg.SelectedIndex, 1);
            strNombreReferencia = cell.ToString().Replace("System.Windows.Controls.DataGridCell:", "").Trim();

            cell = DataGridHelper.GetCell(Dtg, Dtg.SelectedIndex, 2);
            strCodigoColor = cell.ToString().Replace("System.Windows.Controls.DataGridCell:", "").Trim();

            PonerImagen(strCodigoReferencia, strCodigoColor, strNombreReferencia);
            txtCodigoReferencia.Text = strCodigoReferencia;
        }
        private void BtnImprimirEtiquetas_Click(object sender, RoutedEventArgs e)
        {
            #region VALIDAMOS LOS DATOS DE LAS CANTIDADES DE LAS TALLAS PARA QUE SEAN MENOR O IGUAL AL VALOR DE LA ORDEN
            int IntValorRealOrden = 0;//FJRF - Para capturar el valor de la orden
            int IntNuevoValorOrden = 0;//FJRF - Para el nuevo valor de la orden a imprimir

            DataTable DtRecorrerColumnas = new DataTable();//FJRF - Creamos un Dt para leer las columnas
            DataTable DtRecorrerFilas = new DataTable();//FJRF - Creamos un Dt para leer las filas

            String StrTallaConError = "";//FJRF - Para tener el valor de la talla con error
            String StrCodigoDeLaReferenciaConError = "";//FJRF - para capturar la referecia con error

            DtRecorrerColumnas = DtConsulta;//FJRF - Cargamos el grid de consultas donde estan los datos de la busqueda principal
            DtRecorrerFilas = DtConsulta;//FJRF - Cargamos el grid de consultas donde estan los datos de la busqueda principal

            Boolean BooValorErroneoArreglado = false;//FJRF - Variable para informar si se ha arreglado algun dato malo

            for (int IntFilaActual = 0; IntFilaActual < DtRecorrerFilas.Rows.Count; IntFilaActual++)//FJRF - Recorremos la informacion encontrada
            {
                for (int IntColumnaActual = 4; IntColumnaActual < DtRecorrerColumnas.Columns.Count - 1; IntColumnaActual++)//FJRF - Recorremos la informacion encontrada
                {
                    IntValorRealOrden = int.Parse(Dt.Rows[IntFilaActual][IntColumnaActual].ToString());//FJRF - Extraemos el valor de cantidad en una variable q se pueda manipular mas facil
                    IntNuevoValorOrden = int.Parse(DtRecorrerColumnas.Rows[IntFilaActual][IntColumnaActual].ToString());//FJRF - Extraemos el valor de cantidad en una variable q se pueda manipular mas facil

                    if (IntNuevoValorOrden > IntValorRealOrden)//FJRF - Si la cantidad a imprimir es mayor a la cantidad de la orden
                    {
                        StrTallaConError = DtRecorrerColumnas.Columns[IntColumnaActual].ToString();
                        StrCodigoDeLaReferenciaConError = DtRecorrerColumnas.Rows[IntFilaActual][0].ToString();

                        BooValorErroneoArreglado = true;
                        break;
                    }
                }
                if (BooValorErroneoArreglado == true)
                {
                    break;
                }
            }
            #endregion

            if (BooValorErroneoArreglado == true)
            {
                StrCaptionBox = "PROCESO CANCELADO";
                StrMensajeBox = "Datos incorrectos: El número asignado en la talla (" + StrTallaConError + ") con el valor (" + IntNuevoValorOrden + ") no puede ser superior al número total autorizado que es (" + IntValorRealOrden + ") en la orden (" + TxtOrden.Text.Trim() + ") de la referencia (" + StrCodigoDeLaReferenciaConError + ")... ";
                StrMensajeBox = StrMensajeBox + "Favor corrija los datos he intentelo nuevamente";
                Msgbox(StrCaptionBox, StrMensajeBox, MessageBoxButton.OK, MessageBoxImage.Error);

                PttV_Procesar(false);
                BtnImprimirEtiquetas.IsEnabled = false;
            }
            else
            {
                #region VARIABLES
                String StrCodigoReferencia, StrCodigoColor, StrTalla, StrCantidadPorTalla;//FJRF - Variables para los campos
                String StrConsultaSqlInsert, StrConsultaSqlDelete;//FJRF - Variables para los comandos de sql
                String StrCodigoFormato, StrUsuarioActual, StrNumeroOrden;//FJRF - Variables para el Sp
                string StrComandoDado, StrRutaPlano, StrNombreDocumento, StrRutaImpresionLPT2, StrLineaAEjecutar;//FJRF - Variables para ejecutar el cmd
                String StrMaperoImpresora, StrBorrarPuertoAnterior;
                #endregion

                #region INICIALIZAMOS VARIABLES
                StrCodigoFormato = CboFormato.SelectedValue.ToString();//FJRF - Traemos el formato
                StrUsuarioActual = MDOgeneral.usuario;//FJRF - Traemos el usuario actual
                StrNumeroOrden = TxtOrden.Text.Trim();//FJRF - Traemos el numero de la orden

                
                //FJRF - VARIABLES PARA EL CMD
                StrBorrarPuertoAnterior = "NET USE LPT3: /DELETE";

                StrComandoDado = "COPY";//FJRF - Enviamos el comando que vamos a ejecutar
                StrRutaPlano = MDOgeneral.strRutaImpresionDocumentos;//FJRF - Cargamos la ruta del archivo plano donde la deja el sp
                StrNombreDocumento = StrUsuarioActual.ToUpper().Trim() + "BAR.LIS";//FJRF - Armamos el nombre del documento
                StrRutaImpresionLPT2 = "LPT3";//FJRF - Enviamos la ruta de impresion -  esto es como decir (@"\\frar01\epson_javier")

                StrMaperoImpresora = "NET USE LPT3: " + CboImpresora.SelectedValue.ToString();

                StrLineaAEjecutar = StrComandoDado + " " + StrRutaPlano + StrNombreDocumento + " " + StrRutaImpresionLPT2;//FJRF - Armamos la linea de comando a ejecutar
                
                StrLineaAEjecutarEnCmd = StrLineaAEjecutar;//FJRF - La cargamos en una variable global del formulario porq el proceso cambio
                #endregion

                #region PREGUNTAR SI QUIERE EJECUTAR EL PROCESO
                StrCaptionBox = "Confirmation";
                StrMensajeBox = "Esta seguro de mandar a imprimir las etiquetas?";
                MessageBoxButton buttons = MessageBoxButton.YesNo;
                MessageBoxImage icon = MessageBoxImage.Question;
                #endregion

                if (MessageBox.Show(StrMensajeBox, StrCaptionBox, buttons, icon) == MessageBoxResult.Yes)
                {
                    //FJRF - Creamos las variables que necesitamos para el informe
                    try
                    {
                        Mouse.OverrideCursor = Cursors.Wait;//FJRF - Ponemos una esfera en timpo de espera

                        #region GRABA EN LA TABLA LAS ETIQUERAS QUE SERAN IMPRESAS
                        StrConsultaSqlDelete = "DELETE FROM TMPBARRAS";
                        MdoGeneral.comando(StrConsultaSqlDelete);

                        foreach (var FilaGrid in DtgDatosAProcesar.Items)
                        {
                            StrCodigoReferencia = ReturnDataGridCellText(DtgDatosAProcesar, FilaGrid, 0);
                            if (String.IsNullOrEmpty(StrCodigoReferencia) == false)
                            {
                                StrCodigoColor = ReturnDataGridCellText(DtgDatosAProcesar, FilaGrid, 2);
                                StrTalla = ReturnDataGridCellText(DtgDatosAProcesar, FilaGrid, 4);
                                StrCantidadPorTalla = ReturnDataGridCellText(DtgDatosAProcesar, FilaGrid, 5);

                                StrConsultaSqlInsert = "INSERT INTO TMPBARRAS (CODREF_TMP, CODCOL_TMP, CODTAL_TMP, CANPRO_TMP) ";
                                StrConsultaSqlInsert = StrConsultaSqlInsert + "VALUES ('" + StrCodigoReferencia + "', '" + StrCodigoColor + "', '" + StrTalla + "', " + StrCantidadPorTalla + ") ";

                                MdoGeneral.comando(StrConsultaSqlInsert);
                            }
                        }
                        #endregion

                        EjecutarSp_ImpBarras(StrCodigoFormato, StrUsuarioActual, StrNumeroOrden);//FJRF - Ejecutamos el sp con el numero de la orden

                        //EjecutarComando(StrBorrarPuertoAnterior);//FJRF - Ejecutamos el comando dado en la linea (Borramos el puerto de la impresora)
                        EjecutarComando(StrMaperoImpresora);//FJRF - Ejecutamos el comando dado en la linea (Mapeando la imprsora)

                        //DamosTiempoParaImpresionYEjecutamos(8);//FJRF - El proceso se ejecuta ocho segundos despues
                        EjecutarComando(StrLineaAEjecutarEnCmd);//FJRF - Ejecutamos el comando dado en la linea

                        StrCaptionBox = "REALIZANDO IMPRESIÓN";
                        StrMensajeBox = "Las etiquetas se estan imprimiendo con exito";
                        Msgbox(StrCaptionBox, StrMensajeBox, MessageBoxButton.OK, MessageBoxImage.Information);

                        StrConsultaSqlDelete = "DELETE FROM TMPBARRAS";//FJRF - Creamos la consulta
                        MdoGeneral.comando(StrConsultaSqlDelete);//FJRF - Borramos los datos que puedan haber en la tabla

                        Mouse.OverrideCursor = Cursors.Arrow;//FJRF - Ponemos el cursor de forma normal nuevamente

                        TxtOrden.Focus();//FJRF - Enviamos el cursor para una nueva orden
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);
                        Mouse.OverrideCursor = Cursors.Arrow;//FJRF - Ponemos el cursor de forma normal nuevamente
                    }
                }
                else
                {
                    MessageBoxResult result = MessageBox.Show("La impresión fue cancelada", "PROCESO CANCELADO");
                    Mouse.OverrideCursor = Cursors.Arrow;//FJRF - Ponemos el cursor de forma normal nuevamente
                }
            }
        }
        System.Windows.Threading.DispatcherTimer dispatcherTimer = new System.Windows.Threading.DispatcherTimer();//FJRF - Creamos un manejador de tiempo
        private void DamosTiempoParaImpresionYEjecutamos(int IntSegundos)
        {
            dispatcherTimer = new System.Windows.Threading.DispatcherTimer();//FJRF - Creamos un nuevo elemento de manejador de tiempo

            dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick);//FJRF - Decimos el evento que lo ejecutara
            dispatcherTimer.Interval = new TimeSpan(0, 0, IntSegundos);//FJRF - Decimos el tiempo de espera
            dispatcherTimer.Start();//FJRF - Inicializamos el proceso
        }
        private void dispatcherTimer_Tick(object sender, EventArgs e)
        {
            EjecutarComando(StrLineaAEjecutarEnCmd);//FJRF - Ejecutamos el comando dado en la linea

            dispatcherTimer.Stop();//FJRF - Detenemos el temporizador para que no se siga ejecutando
            dispatcherTimer = null;//FJRF - Lo volvemos null o no se detendra

            StrCaptionBox = "REALIZANDO IMPRESIÓN";
            StrMensajeBox = "Las etiquetas se estan imprimiendo con exito";
            Msgbox(StrCaptionBox, StrMensajeBox, MessageBoxButton.OK, MessageBoxImage.Information);
        }

        private void Window_KeyDown(object sender, KeyEventArgs e)
        {
            var elemento = e.OriginalSource as UIElement;
            if (e.Key == Key.F3 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta == true) { MDOgeneral.logBusquedadAbierta = false; }
            }

            if (e.Key == Key.F4 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta1 == true) { MDOgeneral.logBusquedadAbierta1 = false; }
            }

            if (e.Key == Key.F5 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta2 == true) { MDOgeneral.logBusquedadAbierta2 = false; }
            }
        }
        private void DtgInformacion_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            #region FJRF - Saber Fila y Columna indexada

            int IntColumnaIndexada, IntFilaIndexada;
            DependencyObject dep = (DependencyObject)e.OriginalSource;

            //Stepping through the visual tree
            while ((dep != null) && !(dep is System.Windows.Controls.DataGridCell))
            {
                dep = VisualTreeHelper.GetParent(dep);
            }

            //Is the dep a cell or outside the bounds of Window1?
            if (dep == null | !(dep is System.Windows.Controls.DataGridCell))
            {
                return;
            }
            else
            {
                System.Windows.Controls.DataGridCell cell = new System.Windows.Controls.DataGridCell();
                cell = (System.Windows.Controls.DataGridCell)dep;
                while ((dep != null) && !(dep is DataGridRow))
                {
                    dep = VisualTreeHelper.GetParent(dep);
                }

                if (dep == null)
                {
                    return;
                }
                int colindex = cell.Column.DisplayIndex;  //this returns COLUMN INDEX
                IntColumnaIndexada = colindex;

                DataGridRow row = dep as DataGridRow;
                System.Windows.Controls.DataGrid dataGrid = ItemsControl.ItemsControlFromItemContainer(row) as System.Windows.Controls.DataGrid;
                int rowindex = dataGrid.ItemContainerGenerator.IndexFromContainer(row); //this returns ROW INDEX

                IntFilaIndexada = rowindex;
            }
            #endregion

            int IntFilaActual, IntCantidadRegistros, IntRegistrosActuales, IntCantidadColumnas;//FJRF Creamos las variables que necesitamos para el proceso actual

            IntCantidadRegistros = DtgInformacion.Items.Count;//FJRF - Traemos la cantidad de filas que tenga el grid
            IntCantidadColumnas = DtgInformacion.Columns.Count - 1;//FJRF - Para saber la cantidad de columnas

            IntFilaActual = IntFilaIndexada + 1;//FJRF - La fila actual es la fila indexada mas uno porque empieza en cero
            IntRegistrosActuales = IntCantidadRegistros - 1;//FJRF - Los registros actuales es la cantidad de filas menos una porque siempre debe de sobrar una

            var elemento = e.OriginalSource as UIElement;
            if (e.Key == Key.Enter && elemento != null)
            {
                if ((IntColumnaIndexada == IntCantidadColumnas))
                {
                    BtnProcesar.Focus();
                }
                else
                {
                    e.Handled = true;
                    elemento.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
                }
            }
        }

        #region FJRF - FuncionesEspecialesParaLasPropiedadesDeLaCeldaYElFoco

        public static T FindVisualChild<T>(DependencyObject obj) where T : DependencyObject
        {
            for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
            {
                DependencyObject child = VisualTreeHelper.GetChild(obj, i);
                if (child != null && child is T)
                    return (T)child;
                else
                {
                    T childOfChild = FindVisualChild<T>(child);
                    if (childOfChild != null)
                        return childOfChild;
                }
            }
            return null;
        }
        public static DataGridCell GetCell(DataGrid dataGrid, DataGridRow rowContainer, int column)
        {
            if (rowContainer != null)
            {
                DataGridCellsPresenter presenter = FindVisualChild<DataGridCellsPresenter>(rowContainer);
                if (presenter == null)
                {
                    /* if the row has been virtualized away, call its ApplyTemplate() method 
                     * to build its visual tree in order for the DataGridCellsPresenter
                     * and the DataGridCells to be created */
                    rowContainer.ApplyTemplate();
                    presenter = FindVisualChild<DataGridCellsPresenter>(rowContainer);
                }
                if (presenter != null)
                {
                    DataGridCell cell = presenter.ItemContainerGenerator.ContainerFromIndex(column) as DataGridCell;
                    if (cell == null)
                    {
                        /* bring the column into view
                         * in case it has been virtualized away */
                        dataGrid.ScrollIntoView(rowContainer, dataGrid.Columns[column]);
                        cell = presenter.ItemContainerGenerator.ContainerFromIndex(column) as DataGridCell;
                    }
                    return cell;
                }
            }
            return null;
        }
        public static void SelectRowByIndexes(DataGrid dataGrid, params int[] rowIndexes)
        {
            if (!dataGrid.SelectionUnit.Equals(DataGridSelectionUnit.FullRow))
                throw new ArgumentException("The SelectionUnit of the DataGrid must be set to FullRow.");

            if (!dataGrid.SelectionMode.Equals(DataGridSelectionMode.Extended))
                throw new ArgumentException("The SelectionMode of the DataGrid must be set to Extended.");

            if (rowIndexes.Length.Equals(0) || rowIndexes.Length > dataGrid.Items.Count)
                throw new ArgumentException("Invalid number of indexes.");

            dataGrid.SelectedItems.Clear();
            foreach (int rowIndex in rowIndexes)
            {
                if (rowIndex < 0 || rowIndex > (dataGrid.Items.Count - 1))
                    throw new ArgumentException(string.Format("{0} is an invalid row index.", rowIndex));

                object item = dataGrid.Items[rowIndex]; //=Product X
                dataGrid.SelectedItems.Add(item);

                DataGridRow row = dataGrid.ItemContainerGenerator.ContainerFromIndex(rowIndex) as DataGridRow;
                if (row == null)
                {
                    dataGrid.ScrollIntoView(item);
                    row = dataGrid.ItemContainerGenerator.ContainerFromIndex(rowIndex) as DataGridRow;
                }
                if (row != null)
                {
                    DataGridCell cell = GetCell(dataGrid, row, 0);
                    if (cell != null)
                        cell.Focus();
                }
            }
        }
        public static void SelectCellByIndex(DataGrid dataGrid, int rowIndex, int columnIndex)
        {
            if (!dataGrid.SelectionUnit.Equals(DataGridSelectionUnit.Cell))
                throw new ArgumentException("The SelectionUnit of the DataGrid must be set to Cell.");

            if (rowIndex < 0 || rowIndex > (dataGrid.Items.Count - 1))
                throw new ArgumentException(string.Format("{0} is an invalid row index.", rowIndex));

            if (columnIndex < 0 || columnIndex > (dataGrid.Columns.Count - 1))
                throw new ArgumentException(string.Format("{0} is an invalid column index.", columnIndex));

            dataGrid.SelectedCells.Clear();

            object item = dataGrid.Items[rowIndex]; //=Product X
            DataGridRow row = dataGrid.ItemContainerGenerator.ContainerFromIndex(rowIndex) as DataGridRow;
            if (row == null)
            {
                dataGrid.ScrollIntoView(item);
                row = dataGrid.ItemContainerGenerator.ContainerFromIndex(rowIndex) as DataGridRow;
            }
            if (row != null)
            {
                DataGridCell cell = GetCell(dataGrid, row, columnIndex);
                if (cell != null)
                {
                    DataGridCellInfo dataGridCellInfo = new DataGridCellInfo(cell);
                    dataGrid.SelectedCells.Add(dataGridCellInfo);

                    cell.Focus();
                }
            }
        }
        #endregion

        private void imgFoto_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            try
            {
                //Para llamar el PDF de la ficha tecnica de la referencia
                if (File.Exists(MDOgeneral.Fotos_BOSI + txtCodigoReferencia.Text.Trim() + ".PDF"))
                {
                    //MessageBox.Show("Si existe la ficha tecnica", "Confirmación", MessageBoxButton.OK, MessageBoxImage.Hand, MessageBoxResult.OK);
                    String fileName = MDOgeneral.Fotos_BOSI + txtCodigoReferencia.Text.Trim() + ".PDF";
                    System.Diagnostics.Process process = new System.Diagnostics.Process();
                    process.StartInfo.FileName = fileName;
                    process.Start();
                }
                else
                {
                    MessageBox.Show("No existe la ficha tecnica", "Confirmación", MessageBoxButton.OK, MessageBoxImage.Error, MessageBoxResult.OK);
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

    }
}
